﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.NFe.WebServiceNFe;

namespace Sistema.NFe.WebServiceNFe
{
    public abstract class WebServiceNFe
    {
        protected TipoAmbiente _tipoAmbiente;
        protected cUF _cUF;
        protected Versao _versao;
        protected WebService _webservice;

        /// <summary>
        /// Construtor que cria as configurações nescessarias.
        /// </summary>
        /// <param name="TipoAmbiente">TipoAmbiente de envio</param>
        /// <param name="cUF">codigo da uf do emitente</param>
        public WebServiceNFe()
        {

            #region Parametros manuais
            //this._tipoAmbiente = TipoAmbiente.Producao;
            this._cUF = cUF.RioDejaneiro;
            this._versao = Versao.Versao2SOAP12;
            this._webservice = WebService.SVRS;
            #endregion
            this._tipoAmbiente =(TipoAmbiente) new System.Configuration.AppSettingsReader().GetValue("TipoAmbiente", typeof(Int32));

          

        }

        protected IStatusServico StatusServico()
        {
            IStatusServico Retorno =  new ClassesWebServiceFactory().StatusServicoReference(this._versao);
            Retorno.DefinirUrl(new WebServiceURLFactory().GetUrl(this._tipoAmbiente, this._webservice, Operacao.StatusServico, this._versao));
            return Retorno;
        }
        protected IRecepcaoNFe RecepcaoNFe()
        {
            IRecepcaoNFe Retorno = new ClassesWebServiceFactory().RecepcaoNFeReference(this._versao);
            Retorno.DefinirUrl(new WebServiceURLFactory().GetUrl(this._tipoAmbiente, this._webservice, Operacao.Recepcao,this._versao));
            return Retorno;
        }
        protected IConsultaStatusNFe ConsultaNFe()
        {
            IConsultaStatusNFe retorno = new ClassesWebServiceFactory().ConsultaNFeReference(this._versao);
            retorno.DefinirUrl(new WebServiceURLFactory().GetUrl(this._tipoAmbiente, this._webservice, Operacao.RetornoRecepcao, this._versao));
            return retorno;
        }
        protected ICancelamento CancelamentoNFe()
        {
            ICancelamento retorno = new ClassesWebServiceFactory().CancelamentoNFe();
            retorno.DefinirUrl(new WebServiceURLFactory().GetUrl(this._tipoAmbiente, this._webservice, Operacao.Cancelamento, this._versao));
            return retorno;
        }
        protected IInutilizacao InutlizacaoNFe()
        {
            IInutilizacao retorno = new ClassesWebServiceFactory().InutilizacaoNFe();
            retorno.DefinirUrl(new WebServiceURLFactory().GetUrl(this._tipoAmbiente, this._webservice, Operacao.Inutilizacao, this._versao));
            return retorno;
        }

        protected Int32 GetCofUf(cUF Uf)
        {
            return (int)Uf;
        }
        protected String GetVersao(Versao Versao)
        {
            switch(this._versao)
            {
                case Sistema.NFe.Versao.Versao2SOAP12: return "2.00";
                default: return null;
            }
        }
    }

    internal class WebServiceURLFactory
    {
        public String GetUrl(TipoAmbiente ambiente,WebService webservice,Operacao operacao,Versao versao)
        {
            Dictionary<Tuple<TipoAmbiente,WebService,Versao,Operacao>,String> Urls = new Dictionary<Tuple<TipoAmbiente, WebService,Versao,Operacao>,String>();
           
            #region Producao SVRS 2.0
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Producao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.Recepcao),
                    "https://nfe.sefazvirtual.rs.gov.br/ws/Nferecepcao/NFeRecepcao2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Producao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.RetornoRecepcao),
                    "https://nfe.sefazvirtual.rs.gov.br/ws/NfeRetRecepcao/NfeRetRecepcao2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Producao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.Cancelamento),
                    "https://nfe.sefazvirtual.rs.gov.br/ws/NfeCancelamento/NfeCancelamento2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Producao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.StatusServico),
                    "https://nfe.sefazvirtual.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Producao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.Inutilizacao),
                    "https://nfe.sefazvirtual.rs.gov.br/ws/nfeinutilizacao/nfeinutilizacao2.asmx");
            #endregion

            #region Homologacao SVRS 2.0
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Homologacao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.Recepcao),
            "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/Nferecepcao/NFeRecepcao2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Homologacao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.RetornoRecepcao),
                    "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/NfeRetRecepcao/NfeRetRecepcao2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Homologacao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.Cancelamento),
                    "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/NfeCancelamento/NfeCancelamento2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Homologacao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.StatusServico),
                    "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx");
            Urls.Add(new Tuple<TipoAmbiente, WebService, Versao, Operacao>(TipoAmbiente.Homologacao, WebService.SVRS, Versao.Versao2SOAP12, Operacao.Inutilizacao),
                    "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/nfeinutilizacao/nfeinutilizacao2.asmx");
            #endregion

            return Urls[new Tuple<TipoAmbiente,WebService,Versao,Operacao>(ambiente,webservice,versao,operacao)];
       }
    }

    internal class ClassesWebServiceFactory
    {
        public IStatusServico StatusServicoReference(Versao versao)
        {
            return (IStatusServico)new WS200SOAP12.StatusServico.NfeStatusServico2();
        }
        public IRecepcaoNFe RecepcaoNFeReference(Versao versao)
        {
            return (IRecepcaoNFe)new WS200SOAP12.RecepcaoNFe.NfeRecepcao2();
        }
        public IConsultaStatusNFe ConsultaNFeReference(Versao versao)
        {
            return (IConsultaStatusNFe)new WS200SOAP12.RetRecepcao.NfeRetRecepcao2();
        }
        public ICancelamento CancelamentoNFe()
        {
             
            return (ICancelamento)new WS200SOAP12.Cancelamento.NfeCancelamento2();
        }
        public IInutilizacao InutilizacaoNFe()
        {
           return (IInutilizacao)  new WS200SOAP12.InutilizacaoNfe.NfeInutilizacao2();
        }
    }


}
